<?php
abstract class Enum_Helper {
	private static $constCacheArray = NULL;

	private function __construct(){
	}

	public static function getConstants() {
		if (self::$constCacheArray == NULL) {
			self::$constCacheArray = [];
		}
		$calledClass = get_called_class();
		if (!array_key_exists($calledClass, self::$constCacheArray)) {
			$reflect = new ReflectionClass($calledClass);
			self::$constCacheArray[$calledClass] = $reflect->getConstants();
		}
		return self::$constCacheArray[$calledClass];
	}
	
	
	/**
	 * Método responsável por retornar o enum em array
	 * @author Rodrigo Valt <rodrigo@valtsolucoesti.com.br>
	 * @author Valt Soluções em TI
	 * @since 01/08/2015 15:07:50
	 */
	public static function listarEnumArray(){
		$values = array_values(self::getConstants());
		
		$array = null;
		
		foreach ($values as $row){
			
			$codigo = null;
			$descricao = null;
				
			foreach ($row as $key => $row2){
				if (is_numeric($key)){
					$codigo = $key;
				}
			
				if (is_string($row2)){
					$descricao = $row2;
				}
			
				break;
			}
			
			$array[$codigo] = $descricao;
			
		}
		
		return $array;
	}
	
	/**
	 * Método responsável por montar o enum no formato select(html)
	 * @author Rodrigo Valt <rodrigo@valtsolucoesti.com.br>
	 * @author Valt Soluções em TI
	 * @since 01/08/2015 15:07:50
	 */
	public static function listarEnumSelect(){
		$values = array_values(self::getConstants());
		
		$html = "<option></option>";
		
		foreach ($values as $row){
			
			$codigo = null;
			$descricao = null;
			
			foreach ($row as $key => $row2){
				if (is_numeric($key)){
					$codigo = $key;
				}
				
				if (is_string($row2)){
					$descricao = $row2;
				}
				
				break;
			}
			
			$html .= '<option value="'.$codigo.'">'.$descricao.'</option>';
		}
		
		return $html;
	}
	
	/**
	 * Método responsável por montar o enum no formato select(html) e retornar selecionado um valor específico
	 * @author Rodrigo Valt <rodrigo@valtsolucoesti.com.br>
	 * @author Valt Soluções em TI
	 * @since 01/08/2015 15:07:50
	 */
	public static function listarEnumSelectSelecionado($value){
		if (is_array($value)){
			if (is_numeric($value[0])){
				$value = $value[0];
			}else{
				throw new Exception("Parâmetro Inválido");
			}
		}else{
			if (!is_numeric($value)){
				throw new Exception("Parâmetro Inválido");
			}
		}
		
		$values = array_values(self::getConstants());
	
		$html = "<option></option>";
	
		foreach ($values as $row){
				
			$codigo = null;
			$descricao = null;
				
			foreach ($row as $key => $row2){
				if (is_numeric($key)){
					$codigo = $key;
				}
				
				if (is_string($row2)){
					$descricao = $row2;
				}
				
				break;
			}
			
			$selected = (int)$codigo === (int)$value ? 'selected="selected"' : "";
			
			$html .= '<option '.$selected.' value="'.$codigo.'">'.$descricao.'</option>';
		}
	
		return $html;
	}
	
	/**
	 * Método responsável por obter o código do enum, pode passar a descrição ou o enum
	 * @author Rodrigo Valt <rodrigo@valtsolucoesti.com.br>
	 * @author Valt Soluções em TI
	 * @since 01/08/2015 15:06:32
	 */
	public static function getCodigo($valor){
	
		$codigo = null;
		
		if (is_array($valor)){
			foreach ($valor as $key => $row){
				if (is_numeric($key)){
					$codigo = $key;
					break;
				}
			}
		}else if (is_string($valor)){
			$values = array_values(self::getConstants());
			foreach ($values as $row){
				foreach ($row as $key => $row2){
					if (trim($valor) === trim($row2) && is_numeric($key)){
						$codigo = $key;
						break;
					}
				}
			}
		}else{
			throw new Exception("Parâmetro Inválido");
		}
	
		
	
		return $codigo;
	}
	
	/**
	 * Método responsável por obter a descrição do enum, pode passar o código ou o enum
	 * @author Rodrigo Valt <rodrigo@valtsolucoesti.com.br>
	 * @author Valt Soluções em TI
	 * @since 01/08/2015 15:06:32
	 */
	public static function getDescricao($valor){
		
		$descricao = null;
		
		if (is_array($valor)){
			foreach ($valor as $row){
				if (is_string($row)){
					$descricao = $row;
					break;
				}
			}
		}else if (is_numeric($valor)){
			$values = array_values(self::getConstants());
			foreach ($values as $row){
				foreach ($row as $key => $row2){
					if ((int)$valor === (int)$key && is_string($row2)){
						$descricao = $row2;
						break;
					}
				}
			}
		}else{
			throw new Exception("Parâmetro Inválido");
		}
	
		return $descricao;
	}
}